﻿using NLog;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.NetworkInformation;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace JZ_UDI
{
    internal static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            var processName = Process.GetCurrentProcess().ProcessName;
            var processes = Process.GetProcessesByName(processName);
            if (processes.Length > 1)
            {
                // 如果找到多个同名进程，说明已经有一个实例在运行  
                MessageBox.Show("程序已经在运行！");
                return;
            }

            // 添加对未处理的UI线程异常的处理  
            Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);

            // 添加对未处理的非UI线程异常的处理  
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);


            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Global.MacAddress= Global.GetMACAddress();//获取Mac地址
            Application.Run(new frmLogin());
        }

        // 处理UI线程中的未捕获异常  
        private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
        {
            // 可以在这里记录日志、显示错误消息给用户等  
            DialogResult result = ShowErrorDialog(e.Exception);
            Global.SaveLogger(LogLevel.Error, Global.logger.Name, e.Exception.Message);
            // 如果是非关键异常，可以根据用户的选择继续运行  
            // 如果是关键异常，则可能需要关闭应用程序  
            if (result == DialogResult.Abort)
            {
                Application.Exit();
            }
        }

        // 处理非UI线程中的未捕获异常  
        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Exception ex = (Exception)e.ExceptionObject;

            // 因为这是在非UI线程中，所以不能直接显示UI  
            // 可以在这里记录日志或写入到某个文件  
            string errorMessage = $"Unhandled Exception caught: {ex.Message}\n{ex.StackTrace}";
            // 写入到日志文件或其他存储介质  
            Global.SaveLogger(LogLevel.Error, Global.logger.Name, errorMessage);

            // 根据异常类型决定是否关闭应用程序  
            // 通常对于非UI线程的异常，我们可能希望总是关闭应用程序  
            Application.Exit();
        }

        // 显示一个错误对话框给用户  
        private static DialogResult ShowErrorDialog(Exception ex)
        {
            string errorMessage = "An application error occurred. Please contact the administrator with the following details:\n\n" + ex.Message + "\n\nStack Trace:\n" + ex.StackTrace;
            return MessageBox.Show(errorMessage, "Unhandled Exception", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
        }


    }
}
